/*
 * Copyright 2008-2023 dexian.vip. All rights reserved.
 * Support: http://www.dexian.vip
 * License: http://www.dexian.vip/license
 */

package vip.dexian.common.custom.editor;

import vip.dexian.common.CommonAttributes;
import vip.dexian.common.utils.LocalTimeUtils;
import org.apache.commons.lang3.StringUtils;

import java.beans.PropertyEditorSupport;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;

/**
 * LocalTime 属性编辑器，将日期转换为LocalTime类型。将所有符合patterns的日期转换为LocalTime。
 *
 * @author 挺好的 2023年05月30日 8:22
 */
public class LocalTimeEditor extends PropertyEditorSupport {

    /**
     * 时间最短长度
     */
    private static final int TIME_MIN_LENGTH = 5;

    /**
     * 空值处理成null
     */
    private boolean emptyAsNull;

    /**
     * 默认时间格式
     */
    private String timeFormat = CommonAttributes.DatePattern.TIME_2;

    /**
     * 创建LocalTimeEditor
     *
     * @param emptyAsNull
     *         遇见空字符串（去除左右空格）是否转换为null
     */
    public LocalTimeEditor (boolean emptyAsNull) {
        this.emptyAsNull = emptyAsNull;
    }

    /**
     * 创建LocalTimeEditor
     *
     * @param emptyAsNull
     *         遇见空字符串（去除左右空格）是否转换为null
     * @param dateFormat
     *         日期格式{@link CommonAttributes.DatePattern#PATTERNS}
     */
    public LocalTimeEditor (boolean emptyAsNull, String dateFormat) {
        this.emptyAsNull = emptyAsNull;
        this.timeFormat  = dateFormat;
    }

    /**
     * 转换成{@link CommonAttributes.DatePattern#TIME_2}格式
     *
     * @return 如果日期为空，返回空字符{@link org.apache.commons.lang3.StringUtils#EMPTY}
     */
    @Override
    public String getAsText () {
        LocalTime localDateTime = (LocalTime) this.getValue();

        if (localDateTime == null) {
            return StringUtils.EMPTY;
        }

        return LocalTimeUtils.format(this.timeFormat, localDateTime);
    }

    /**
     * text == null ，set value null
     * <p>
     * value = value.trim()
     * <p>
     * (emptyAsNull && StringUtils.isEmpty(value)) ，set value null.
     *
     * @param text
     *         时间
     */
    @Override
    public void setAsText (String text) {
        if (text == null) {
            this.setValue(null);
            return;
        }

        String value = text.trim();

        if (this.emptyAsNull && StringUtils.isEmpty(value)) {
            this.setValue(null);
            return;
        }

        // 如果时间的长度 > 5，使用 HH:mm:ss 格式
        if (value.length() > TIME_MIN_LENGTH) {
            this.setValue(LocalTime.parse(value, DateTimeFormatter.ofPattern(CommonAttributes.DatePattern.TIME)));
        } else {
            this.setValue(LocalTime.parse(value, DateTimeFormatter.ofPattern(this.timeFormat)));
        }
    }
}
